//createdbyØycindØstlund&AdamWardon08/02/2005at17:
25usingSystem;usingSystem.Drawing;usingSystem.Windows.Forms;[Ser
ializable]publicclassCamera{publicconstintDEFAULT_SCREEN_WIDTH=8
00;publicconstintDEFAULT_SCREEN_HEIGHT=600;privateSizem_screenSi
ze;floatm_cameraSpeed;floatm_cameraMovement;floatm_sensitivity;p
rivatefloatm_upDownTot;privateVectorm_position;privateVectorm_lo
okAt;privateVectorm_up;privateVectorm_strafe;privateVectorm_targ
et;privateVectornewTarget;privateMatrixm_worldView;privateintm_c
enterWidth;privateintm_centerHeight;privatefloatm_farPlane;priva
tefloatm_nearPlane;privatefloatm_effectiveFOV;privatefloatm_fov;
privateVectorm_center;privatefloatm_sphereRadius;publicCamera(){
InitCamera();}publicMatrixWorldView{get{returnm_worldView;}}publ
icVectorPosition{get{returnm_position;}}publicVectorLookAt{get{r
eturnm_lookAt;}}publicVectorUp{get{returnm_up;}}publicVectorStra
fe{get{returnm_strafe;}}publicfloatFarPlane{get{returnm_farPlane
;}set{m_farPlane=value;}}publicfloatNearPlane{get{returnm_nearPl
ane;}set{m_nearPlane=value;}}publicfloatFov{get{returnm_fov;}set
{m_fov=value;}}publicVectorCenter{get{returnm_center;}set{m_cent
er=value;}}publicfloatSphereRadius{get{returnm_sphereRadius;}set
{m_sphereRadius=value;}}publicSizeScreenSize{get{returnm_screenS
ize;}}publicstaticCameraCreateDefaultStartCamera(){Cameratemp=ne
wCamera();temp.PositionCamera(newVector(1f,1f,-2f),newVector(0f,
0f,1f),newVector(0f,1f,0f));returntemp;}publicvoidInitCamera(){m
_worldView=newMatrix(4);m_screenSize=newSize(DEFAULT_SCREEN_WIDT
H,DEFAULT_SCREEN_HEIGHT);m_centerWidth=DEFAULT_SCREEN_WIDTH/2;m_
centerHeight=DEFAULT_SCREEN_HEIGHT/2;m_farPlane=18.0f;m_nearPlan
e=1.0f;m_fov=((float)Math.PI/4.0f);m_effectiveFOV=(float)Math.Ta
n(m_fov/2.0f);m_sphereRadius=CalcSphereRadius();m_center=newVect
or();newTarget=newVector();m_cameraSpeed=4.0f;m_sensitivity=300.
0f;Cursor.Position=newPoint(m_centerWidth,m_centerHeight);}//Set
sthePosition,lookatandupvectorforthecamera.publicvoidPositionCam
era(Vectorposition,VectorlookAt,Vectorup){m_position=position;m_
lookAt=lookAt.Normalise();m_target=m_position+m_lookAt;m_up=up;}
privatevoidMouseMovement(){//Getthemousemovementsincelastframe.f
loatupDown=Cursor.Position.Y-m_centerHeight;floatleftRight=Curso
r.Position.X-m_centerWidth;Cursor.Position=newPoint(m_centerWidt
h,m_centerHeight);if(upDown!=0.0f){upDown=upDown/m_sensitivity;/
/Makesurewecan'tpitchourheadtomuchupordownm_upDownTot-=upDown;if
(m_upDownTot>1.0f){m_upDownTot=1.0f;}elseif(m_upDownTot<-1.0f){m
_upDownTot=-1.0f;}//Pitchtheheadupordown.RotateView(upDown,m_str
afe.X,m_strafe.Y,m_strafe.Z);m_lookAt=(m_target-m_position).Norm
alise();}if(leftRight!=0.0f){leftRight=leftRight/m_sensitivity;/
/Pitchtheheadleftorright.//RotateView(leftRight,m_up.X,m_up.Y,m_
up.Z);RotateView(leftRight,0,1,0);}}//Rotatethecameraaroundthepo
sitionusingaxis-anglerotationprivatevoidRotateView(floatangle,fl
oatx,floaty,floatz){//Calculatethesineandcosineoftheangleonceflo
atcosTheta=(float)Math.Cos(angle);floatsinTheta=(float)Math.Sin(
angle);//FindthenewxpositionforthenewrotatedpointnewTarget.X=(co
sTheta+(1-cosTheta)*x)*m_lookAt.X;newTarget.X+=((1-cosTheta)*x*y
-z*sinTheta)*m_lookAt.Y;newTarget.X+=((1-cosTheta)*x*z+y*sinThet
a)*m_lookAt.Z;//FindthenewypositionforthenewrotatedpointnewTarge
t.Y=((1-cosTheta)*x*y+z*sinTheta)*m_lookAt.X;newTarget.Y+=(cosTh
eta+(1-cosTheta)*y)*m_lookAt.Y;newTarget.Y+=((1-cosTheta)*y*z-x*
sinTheta)*m_lookAt.Z;//Findthenewzpositionforthenewrotatedpointn
ewTarget.Z=((1-cosTheta)*x*z-y*sinTheta)*m_lookAt.X;newTarget.Z+
=((1-cosTheta)*y*z+x*sinTheta)*m_lookAt.Y;newTarget.Z+=(cosTheta
+(1-cosTheta)*z)*m_lookAt.Z;//Positionisthesame,justaddthenewtar
gettotheposition.m_target=m_position+newTarget;}privatevoidKeybo
ardMovement(){if(KeyTester.KeyIsDownNow(KeyTester.Key.UP)){//Che
ckifwehittheUparrow//Addthemovementtoourposition.m_position.X+=m
_lookAt.X*m_cameraMovement;m_position.Z+=m_lookAt.Z*m_cameraMove
ment;//Addthemovementtoourviewtarget.m_target.X+=m_lookAt.X*m_ca
meraMovement;m_target.Z+=m_lookAt.Z*m_cameraMovement;}elseif(Key
Tester.KeyIsDownNow(KeyTester.Key.DOWN)){//CheckifwehittheDownar